package com.its.util;

/**
 * ��ҳ�࣬����֧�����ݲ�ѯ����ҳ�������ɷ�ҳ��Ϣ��ҳ��
 * @author ChangWei
 *
 */
public class Pager {
	
	// ��ǰҳ��
	int pageNo;       
	// ÿҳ��������
	int pageSize;     
	// ����������
	int total;        
	// ��ҳ��
	int pageCount;    
	// �����ʾҳ����
	int showPageNos;  
	// ��ʼҳ��
	int start;        
	// ����ҳ��
	int end;          
	
	/**
	 * ��ҳ��
	 * @param pageNo ��ǰҳ��
	 * @param total ����������
	 */
	public Pager(int pageNo, int total) {
		// �ڹ��췽��ͨ��this()�����������췽��
		this(pageNo, total, 10, 7);
	}
	
	/**
	 * ��ҳ��
	 * @param pageNo ��ǰҳ��
	 * @param total ����������
	 * @param pageSize ÿҳ��������
	 * @param showPageNos �����ʾ��ҳ����
	 */
	public Pager(int pageNo, int total, int pageSize, int showPageNos) {
		this.pageNo = pageNo;
		this.pageSize = pageSize;
		this.total = total;
		this.showPageNos = showPageNos;
		
		valid();
		calc();
	}
	
	private void valid() {
		if (pageNo < 1) throw new PagerException("pageNo", 1); 
		if (pageSize < 1) throw new PagerException("pageSize", 1); 
		if (total < 0) throw new PagerException("total", 0); 
		if (showPageNos < 1) throw new PagerException("showPageNos", 1); 
	}
	
	public class PagerException extends RuntimeException {

		private static final long serialVersionUID = 1L;

		public PagerException(String property, int minValue) {
			super(String.format("��ҳ����%s����С��%d��", property, minValue));
		}
		
	}

	private void calc() {
		pageCount = total / pageSize;
		if (total % pageSize > 0) pageCount += 1;
		
		start = end = pageNo;
		while (end - start + 1 < showPageNos && (start > 1 || end < pageCount)) {
			if (start > 1) start--; 
            if (end < pageCount) end++;
        }
	}
	
	@Override
	public String toString() {
		return "Pager [pageNo=" + pageNo + ", pageSize=" + pageSize + ", total=" + total + ", pageCount=" + pageCount
				+ ", showPageNos=" + showPageNos + ", start=" + start + ", end=" + end + "]";
	}

	public static void main(String[] args) {
		
		Pager p1 = new Pager(16, 1003);
		System.out.println(p1);
		
		Pager p2 = new Pager(3, 1003);
		System.out.println(p2);

	}

	/**
	 * ��ȡ��ǰҳ��
	 * @return ��ǰҳ��
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * ��ȡÿҳ��������
	 * @return ÿҳ��������
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * ��ȡ����������
	 * @return ����������
	 */
	public int getTotal() {
		return total;
	}

	/**
	 * ��ȡ������ҳ��
	 * @return ������ҳ��
	 */
	public int getPageCount() {
		return pageCount;
	}

	/**
	 * ��ȡ�����ʾҳ����
	 * @return �����ʾҳ����
	 */
	public int getShowPageNos() {
		return showPageNos;
	}

	/**
	 * ��ȡ��ʼҳ��
	 * @return ��ʼҳ��
	 */
	public int getStart() {
		return start;
	}

	/**
	 * ��ȡ����ҳ��
	 * @return ����ҳ��
	 */
	public int getEnd() {
		return end;
	}

}
